package com.dragon.mmochat.service;

import java.util.Date;
import java.util.concurrent.TimeoutException;

import com.dragon.mmochat.util.MmochatUtil;
import com.skymobi.exception.CurrencyDealException;
import com.skymobi.exception.SkymobiException;
import com.skymobi.message.currency.CurrencyIDCode;
import com.skymobi.message.currency.CurrencyModifyResponse;
import com.skymobi.message.currency.CurrencyQueryResponse;
import com.skymobi.message.currency.CurrencyResponseCode;
import com.skymobi.service.currency.CurrencyService;

/**
 * 虚拟币服务类
 * <p>
 * 新增一种虚拟币需要做下述操作：
 * <p>
 * 1.提供虚拟币编号及更改虚拟币原因编号（如，游戏胜利加钱，玩家第一次玩送钱等等）
 * <p>
 * 2.在CurrencyIDCode中加入相应的虚拟币对象（这一步我们会处理）
 * 
 * @author mega
 */
public class CurrService {

	// 处理更改虚拟币请求，一般常见的运用是服务端处理购买道具，请求虚拟币模块扣钱，玩家打怪获得了若干游戏虚拟币请求加钱等
	// 返回: true:扣钱成功, false:扣钱失败
	@SuppressWarnings("deprecation")
	public static boolean handleModifyCurrency(long skyId, int amount,
			long reasonId) {
		CurrencyIDCode currencyCode = CurrencyIDCode.CURRENCY_ID_KB;// 根据虚拟币类型码获取CurrencyIDCode对象
		try {
			// 调用公共虚拟币服务的更改虚拟币接口，该方法可能返回CurrencyDealException，因而调用者需处理此异常
			CurrencyModifyResponse message = CurrencyService.dealCurrency(
					MmochatMainService.getCommonHandler(), skyId, currencyCode,
					amount, reasonId);

			// 如果返回码正确，表示更改成功
			if (message.getResponseCode() == CurrencyResponseCode.CURR_RESP_SUCCESS) {
				return true;
			} else {
				// 如果返回码不正确，表示更改失败，有很多种失败类型，某些用户可以理解的错误可以单独处理，返回友好的错误提示，其他的统一在此处理
				return false;
			}
		} catch (CurrencyDealException e) {
			// 如果更改虚拟币失败
			long baseId = e.getBaseId();// 获取当前模块中虚拟币模块中获取的baseId
			long seq = e.getSeq();// 获取当前请求的序列号
			// 一般在此需要在文件或者数据库等中记录此2个参数，用于日后对账，
			// 因为实际操作中有可能操作成功但是收到异常，比如操作超时等
			Date now = new Date();
			int month = now.getMonth() + 1;
			int day = now.getDate();
			int hour = now.getHours();
			int min = now.getMinutes();
			int sec = now.getSeconds();
			String time = month + "月" + day + "日" + hour + ":" + min + ":"
					+ sec;

			MmochatUtil.writeToFile("mmochat_dealKB_checkTimeOut.log", time
					+ "\tskyId=" + skyId + ",reasonId=" + reasonId + ",amount="
					+ amount + "; baseId=" + baseId + ",seq=" + seq + "\r\n");
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 处理查询虚拟币请求 返回: >=0: 查询成功，值为金额 -1: 查询失败
	 */
	public static int handleQueryCurrency(long skyId) {
		CurrencyIDCode currencyCode = CurrencyIDCode.CURRENCY_ID_KB;// 根据虚拟币类型码获取CurrencyIDCode对象
		try {
			// 调用公共虚拟币服务的查询虚拟币接口，该方法可能返回SkymobiException及TimeoutException，因而调用者需处理此2类异常
			CurrencyQueryResponse message = CurrencyService
					.queryCurrencyBalance(
							MmochatMainService.getCommonHandler(), skyId,
							currencyCode);
			if (message.getResponseCode() == CurrencyResponseCode.CURR_RESP_SUCCESS) {// 如果返回码正确，表示查询成功
				return (int) message.getCurrAmountArray()[0];// 返回响应，因为只请求了一种虚拟币，因而成功消息返回虚拟币余额队列长度只可能为1
			} else {// 如果返回码不正确，表示查询失败，有很多种失败类型，某些用户可以理解的错误可以单独处理，返回友好的错误提示，其他的统一在此处理
				return -1;// 返回错误消息
			}
		} catch (SkymobiException e) {// 查询虚拟币执行异常，一般不会出现此异常
			return -1;// 返回错误消息
		} catch (TimeoutException e) {// 查询虚拟币超时异常，如果超时比较频繁可以适当增加请求时间或者质询我们的开发人员，可能当前虚拟币模块比较繁忙导致处理效率下降
			return -1;// 返回错误消息
		}
	}

}
